﻿' ******************************************************************************
' ** 
' **  Yahoo! Managed
' **  Written by Marius Häusler 2011
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2011 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace YahooManaged.Finance

    ''' <summary>
    ''' Stores informations of different quote values. Implements IID.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class QuoteData
        Inherits QuoteBaseData

        Private mValues(87) As Object

        ''' <summary>
        ''' Gets or sets the value of a specfic property
        ''' </summary>
        ''' <param name="prp">Gets or sets the property you want to get or set</param>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Default Public Property Values(ByVal prp As QuoteProperty) As Object
            Get
                Return mValues(prp)
            End Get
            Set(ByVal value As Object)
                If value IsNot Nothing Then
                    Select Case prp
                        Case QuoteProperty.Symbol : MyBase.SetID(value.ToString)
                        Case QuoteProperty.LastTradePriceOnly : If TypeOf value Is Double Then Double.TryParse(value.ToString, MyBase.LastTradePriceOnly)
                        Case QuoteProperty.LastTradeDate : If TypeOf value Is Date Then Date.TryParse(value.ToString, MyBase.LastTradeDate)
                        Case QuoteProperty.LastTradeTime : If TypeOf value Is Date Then Date.TryParse(value.ToString, MyBase.LastTradeTime)
                        Case QuoteProperty.Change : If TypeOf value Is Double Then Double.TryParse(value.ToString, MyBase.Change)
                        Case QuoteProperty.Open : If TypeOf value Is Double Then Double.TryParse(value.ToString, MyBase.Open)
                        Case QuoteProperty.DaysHigh : If TypeOf value Is Double Then Double.TryParse(value.ToString, MyBase.DaysHigh)
                        Case QuoteProperty.DaysLow : If TypeOf value Is Double Then Double.TryParse(value.ToString, MyBase.DaysLow)
                        Case QuoteProperty.Volume : If TypeOf value Is Long Then Long.TryParse(value.ToString, MyBase.Volume)
                    End Select
                End If
                mValues(prp) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the name of the QuoteData
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.Name</remarks>
        Public Property Name() As String
            Get
                If mValues(QuoteProperty.Name) IsNot Nothing Then : Return mValues(QuoteProperty.Name).ToString
                Else : Return String.Empty
                End If
            End Get
            Set(ByVal value As String)
                mValues(QuoteProperty.Name) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets the ID of the QuoteData
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.Symbol</remarks>
        Public Overrides ReadOnly Property ID() As String
            Get
                Return MyBase.ID
            End Get
        End Property
        ''' <summary>
        ''' Sets a new ID value. Implementation from ISettableID.
        ''' </summary>
        ''' <param name="id">A valid Yahoo! ID</param>
        ''' <remarks></remarks>
        Public Overrides Sub SetID(ByVal id As String)
            MyBase.SetID(id)
            mValues(QuoteProperty.Symbol) = id
        End Sub

        ''' <summary>
        ''' Gets or sets the latest price value of the QuoteData.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.LastTradePriceOnly</remarks>
        Public Overrides Property LastTradePriceOnly() As Double
            Get
                Return MyBase.LastTradePriceOnly
            End Get
            Set(ByVal value As Double)
                MyBase.LastTradePriceOnly = value
                mValues(QuoteProperty.LastTradePriceOnly) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the date value of the last trade.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property LastTradeDate() As Date
            Get
                Return MyBase.LastTradeDate
            End Get
            Set(ByVal value As Date)
                MyBase.LastTradeDate = value
                mValues(QuoteProperty.LastTradeDate) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the time value of the last trade.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property LastTradeTime() As DateTime
            Get
                Return MyBase.LastTradeTime
            End Get
            Set(ByVal value As DateTime)
                MyBase.LastTradeTime = value
                mValues(QuoteProperty.LastTradeTime) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the change in percent.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property Change() As Double
            Get
                Return MyBase.Change
            End Get
            Set(ByVal value As Double)
                MyBase.Change = value
                mValues(QuoteProperty.Change) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the opening price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property Open() As Double
            Get
                Return MyBase.Open
            End Get
            Set(ByVal value As Double)
                MyBase.Open = value
                mValues(QuoteProperty.Open) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the highest price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property DaysHigh() As Double
            Get
                Return MyBase.DaysHigh
            End Get
            Set(ByVal value As Double)
                MyBase.DaysHigh = value
                mValues(QuoteProperty.DaysHigh) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the lowest price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property DaysLow() As Double
            Get
                Return MyBase.DaysLow
            End Get
            Set(ByVal value As Double)
                MyBase.DaysLow = value
                mValues(QuoteProperty.DaysLow) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the trade volume of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Property Volume() As Long
            Get
                Return MyBase.Volume
            End Get
            Set(ByVal value As Long)
                MyBase.Volume = value
                mValues(QuoteProperty.Volume) = value
            End Set
        End Property

        Public Overrides ReadOnly Property PreviewClose As Double
            Get
                If Me.Values(QuoteProperty.PreviousClose) IsNot Nothing AndAlso TypeOf Me.Values(QuoteProperty.PreviousClose) Is Double Then
                    Return CDbl(Me.Values(QuoteProperty.PreviousClose))
                Else
                    Return MyBase.PreviewClose
                End If
            End Get
        End Property
        Public Overrides ReadOnly Property ChangeInPercent As Double
            Get
                If Me.Values(QuoteProperty.ChangeInPercent) IsNot Nothing AndAlso TypeOf Me.Values(QuoteProperty.ChangeInPercent) Is Double Then
                    Return CDbl(Me.Values(QuoteProperty.ChangeInPercent))
                Else
                    Return MyBase.ChangeInPercent
                End If
            End Get
        End Property
        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub

        ''' <summary>
        ''' Copies the values of a QuoteData to this instance.
        ''' </summary>
        ''' <param name="newValue"></param>
        ''' <remarks></remarks>
        Public Overloads Sub CopyData(ByVal newValue As QuoteData)
            MyBase.CopyData(newValue)
            For Each qp As QuoteProperty In [Enum].GetValues(GetType(QuoteProperty))
                If TypeOf newValue(qp) Is Object() Then
                    Dim obj() As Object = CType(newValue(qp), Object())
                    Dim newObj(obj.Length - 1) As Object
                    If obj.Length > 0 Then
                        For i As Integer = 0 To obj.Length - 1
                            newObj(i) = obj(i)
                        Next
                    End If
                    mValues(qp) = newObj
                Else
                    mValues(qp) = newValue(qp)
                End If
            Next
        End Sub

    End Class

End Namespace